package com.loong.android.tools;

/**
 * 对象操作工具类
 */
public class ObjectUtils {

    /**
     * 判断对象是否为布尔值(boolean)
     * @param obj 待判断的对象
     */
    public static boolean isBoolean(Object obj) {
        return obj instanceof Boolean;
    }

    /**
     * 判断对象是否为字节型(byte)
     * @param obj 待判断的对象
     */
    public static boolean isByte(Object obj) {
        return obj instanceof Byte;
    }

    /**
     * 判断对象是否为字符型(char)
     * @param obj 待判断的对象
     */
    public static boolean isChar(Object obj) {
        return obj instanceof Character;
    }

    /**
     * 判断对象是否为短整数型(short)
     * @param obj 待判断的对象
     */
    public static boolean isShort(Object obj) {
        return obj instanceof Short;
    }

    /**
     * 判断对象是否为整数型(int)
     * @param obj 待判断的对象
     */
    public static boolean isInt(Object obj) {
        return obj instanceof Integer;
    }

    /**
     * 判断对象是否为长整数型(long)
     * @param obj 待判断的对象
     */
    public static boolean isLong(Object obj) {
        return obj instanceof Long;
    }

    /**
     * 判断对象是否为小数型(float)
     * @param obj 待判断的对象
     */
    public static boolean isFloat(Object obj) {
        return obj instanceof Float;
    }

    /**
     * 判断对象是否为长小数型(double)
     * @param obj 待判断的对象
     */
    public static boolean isDouble(Object obj) {
        return obj instanceof Double;
    }

    /**
     * 判断对象是否为文本型的字符串
     * @param obj 待判断的对象
     */
    public static boolean isString(Object obj) {
        return obj instanceof String;
    }

    /**
     * 判断两个对象是否为同一个对象
     * @param obj1 对象1
     * @param obj2 对象2
     */
    public static boolean equals(Object obj1, Object obj2) {
        if(obj1 == null || obj2 == null) return false;
        return obj1.equals(obj2);
    }

    /**
     * 将对象转为文本
     * @param obj 对象数据
     */
    public static String toString(Object obj) {
        return "" + obj;
    }

    /**
     * 取对象的hashCode
     * @param obj 对象数据
     * @return 若对象数据为null，则返回0
     */
    public static int hashCode(Object obj) {
        if(obj == null) return 0;
        return obj.hashCode();
    }

    /**
     * 取对象的Class类对象
     * @param obj 对象数据
     */
    public static Object getClass(Object obj) {
        if(obj == null) return null;
        return obj.getClass();
    }

    /**
     * 唤醒正在等待的线程
     * @param obj 对象数据
     */
    public static void notify(Object obj) {
        if(obj == null) return;
        obj.notify();
    }

    /**
     * 唤醒正在等待的线程
     * @param obj 对象数据
     */
    public static void notifyAll(Object obj) {
        if(obj == null) return;
        obj.notifyAll();
    }

    /**
     * 使当前线程进入等待状态，直到其他线程调用此对象的notify()或notifyAll()。注意必须放在try catch中执行
     * @param obj 对象数据
     */
    public static void wait(Object obj) throws InterruptedException {
        if(obj == null) return;
        obj.wait();
    }

    /**
     * 使当前线程进入等待状态，直到其他线程调用此对象的notify()或notifyAll()。注意必须放在try catch中执行
     * @param obj 对象数据
     * @param timeout 超时
     */
    public static void wait(Object obj, long timeout) throws InterruptedException {
        if(obj == null) return;
        obj.wait(timeout);
    }

    /**
     * 使当前线程进入等待状态，直到其他线程调用此对象的notify()或notifyAll()。注意必须放在try catch中执行
     * @param obj 对象数据
     * @param timeout 超时
     */
    public static void wait(Object obj, long timeout, int nanos) throws InterruptedException {
        if(obj == null) return;
        obj.wait(timeout, nanos);
    }
}
